package com.cheng.code;

import com.cheng.utils.ThumbnailsImageUtils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import net.coobird.thumbnailator.geometry.Positions;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.HashMap;

/**
 * 二维码生成工具类
 * @author cheng-qiang
 * @date 2022年08月11日15:51
 */
public class QRCodeGenerator {

    /**
     * 根据内容，大小生成二维码到指定路径
     *
     * @param contents 跳转的链接内容
     * @param width    二维码的宽度
     * @param height   二维码的高度
     * @param filePath 生成的二维码后的存放路径
     */
    public static void generateQrWithImage(String contents, int width, int height, String filePath) throws WriterException, IOException {
        //构造二维码写码器
        MultiFormatWriter muteWriter = new com.google.zxing.MultiFormatWriter();
        HashMap<EncodeHintType, Object> hint = new HashMap<>(16);
        // 编码
        hint.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 二维码的容错率 不同密度的二维码所包含的信息其编码的字符、容错率均不同。
        // 密度越低，编码的字符个数越少、容错率越低，二维码容错率表示二维码图标被遮挡多少后，仍可以被扫描出来的能力。
        // 目前，典型的二维码的容错率分为 7%、15%、25%、30% 四个等级，容错率越高，越容易被快速扫描。
        // 但是，容错率越高，二维码里面的黑白格子也就越多。因此，对于目前主流手机，在绝大多数扫描场景下，仍普遍应用 7% 容错率的二维码就能满足需求。
        hint.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H);
        // 二维码的边框
        hint.put(EncodeHintType.MARGIN, 1);
        //生成二维码
        BitMatrix bitMatrix = muteWriter.encode(contents, BarcodeFormat.QR_CODE, width, height, hint);
        Path path = FileSystems.getDefault().getPath(filePath);
        MatrixToImageWriter.writeToPath(bitMatrix, "jpeg", path);
    }

    // public static void main(String[] args) {
    //     try {
    //         QRCodeGenerator.generateQrWithImage("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzkzOTMwODI1OQ==&scene=124#wechat_redirect", 500, 500, "./QRCode/QRCode.jpeg");
    //     } catch (Exception ignored) {
    //     }
    // }

    public static void main(String[] args) {
        try {
            // 将大图片缩小到指定大小
            ThumbnailsImageUtils.size("./QRCode/img.png", 100, 100, 1, "./QRCode/img.png");
            // 通过水印的形式，将头像加到生成的二维码上面
            ThumbnailsImageUtils.watermark("./QRCode/QRCode.jpeg",
                    500, 500, Positions.CENTER, "./QRCode/img.png",
                    1f, 1f, "./QRCode/QRCode_face.png");
        } catch (Exception ignored) {
        }
    }
}
